home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / winlib.lzh / WINLIB / DESKTOP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-01  |  33.3 KB  |  929 lines

  1. /********************************************************************
  2.  *                                                                    *
  3.  *    Desktop icon handling routines                                    *
  4.  *    Copyright (C) 1994, Bitgate Software and Clever Bits            *
  5.  *                                                                    *
  6.  *    Finally, desktop icon handling routines!  And it wasn't as easy    *
  7.  *    to figure out as it looks.  I had to write these from scratch!    *
  8.  *                                                                    *
  9.  *    These are the routines used to handle icons on the desktop, and *
  10.  *    handle the information exchange between icons.  Although they're*
  11.  *    not mega-sophisticated, they're sophisticated enough to handle    *
  12.  *    the movement and iconification of windows, as well as the        *
  13.  *    deletion of other windows.                                        *
  14.  *                                                                    *
  15.  ********************************************************************
  16.  *                                                                    *
  17.  *    Update log:                                                        *
  18.  *    [3.2.94 - 26.2.94] Ken Hollis                                    *
  19.  *        (icons)                - added for better looking desktop        *
  20.  *                            - fixed some size problems                *
  21.  *        (resource)            - added more icons and an info line        *
  22.  *                            - removed info line, updated icons        *
  23.  *        WSetup_Desktop        - added                                    *
  24.  *                            - added fix for monochrome users        *
  25.  *        WDesk_Redraw        - added and fixed                        *
  26.  *                            - worked on majorly                        *
  27.  *        WDesk_PortionRedraw    - added and fixed                        *
  28.  *        WSet_IconPosition    - added and fixed                        *
  29.  *        WDo_Desk            - added and fixed majorly                *
  30.  *                            - added better mouse handling routine    *
  31.  *                            - added custom drag routine                *
  32.  *                            - added custom popup menu for selections*
  33.  *                            - added popup for icon selections        *
  34.  *                            - added initial click checking            *
  35.  *                            - added checking of icon states (so you    *
  36.  *                                can't uniconify a hidden icon)        *
  37.  *                            - added mouse form changing to match icn*
  38.  *        WIconify            - added                                    *
  39.  *                            - added shrink box animation            *
  40.  *                            - added mouse form changing to match icn*
  41.  *                            - fixed a bug when called                *
  42.  *        WRemove_Icon        - added                                    *
  43.  *                            - added move box animation                *
  44.  *        WFindIconWindow        - added for locating a window w/an icon *
  45.  *        (global)            - added better redraw routines            *
  46.  *                                                                    *
  47.  ********************************************************************/
  48.  
  49. #include <string.h>
  50. #include "winlib.h"
  51.  
  52. #ifndef __DESKTOP__
  53. #define __DESKTOP__
  54. #endif
  55.  
  56. static char ptnull[1] = "";
  57.  
  58. TEDINFO dt_tedinfo[] = {
  59.   {"DESK  V0.26", ptnull, ptnull, 5, 0, 0, 4352, 0, 0, 12, 1}};
  60.  
  61. int clipboardmask[] = {
  62.   0x0000,0x0000,0x0007,0xe000,0x000f,0xf000,0x01ff,0xff80,
  63.   0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,
  64.   0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,
  65.   0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,
  66.   0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,
  67.   0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,
  68.   0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,0x3fff,0xfffc,
  69.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  70. };
  71.  
  72. int clipboarddata[] = {
  73.    0x0000,0x0000,0x0007,0xe000,0x000c,0x3000,0x01f9,0x9f80,
  74.    0x3f00,0x00fc,0x2300,0x00c4,0x2fff,0xfff4,0x2fff,0xfff4,
  75.    0x2800,0x0014,0x2918,0x2014,0x2901,0xf414,0x2984,0x0014,
  76.    0x2800,0x0014,0x29ff,0xff14,0x2800,0x0014,0x2800,0x0014,
  77.    0x2800,0x0014,0x2800,0x0014,0x2800,0x0014,0x29ff,0x7f94,
  78.    0x2931,0x4c94,0x2979,0x5c94,0x2901,0x4094,0x29ff,0x7f94,
  79.    0x2800,0x0014,0x2fff,0xfff4,0x2000,0x0004,0x3fff,0xfffc,
  80.    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  81. };
  82.  
  83. int trashcanmask[] = {
  84.   0x0000,0x0000,0x0000,0x0000,0x0007,0xe000,0x007f,0xfe00,
  85.   0x01ff,0xff80,0x03ff,0xffc0,0x03ff,0xffc0,0x01ff,0xff80,
  86.   0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,
  87.   0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,
  88.   0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,
  89.   0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,
  90.   0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,0x01ff,0xff80,
  91.   0x003f,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  92. };
  93.  
  94. int trashcandata[] = {
  95.    0x0000,0x0000,0x0000,0x0000,0x0007,0xe000,0x007e,0x7e00,
  96.    0x01c6,0x6380,0x0200,0x0040,0x03c0,0x03c0,0x017f,0xfe80,
  97.    0x0100,0x0080,0x0144,0x2280,0x0144,0x2280,0x0144,0x2280,
  98.    0x0144,0x2280,0x0144,0x2280,0x0144,0x2280,0x0144,0x8a80,
  99.    0x0144,0xda80,0x0144,0x7280,0x0144,0x2280,0x0144,0x2280,
  100.    0x0144,0x2280,0x0144,0x2280,0x0144,0x2280,0x0144,0x2280,
  101.    0x0144,0x2280,0x0164,0x2680,0x0106,0x6080,0x01e0,0x0780,
  102.    0x003f,0xfc00,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  103. };
  104.  
  105. int dialogmask[] = {
  106.   0x7fff,0xfff8,0x7fff,0xfff8,0x7fff,0xffff,0x7fff,0xffff,
  107.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  108.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  109.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  110.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  111.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  112.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  113.   0x7fff,0xffff,0x7fff,0xffff,0x0fff,0xffff,0x0fff,0xffff
  114. };
  115.  
  116. int dialogdata[] = {
  117.    0x0000,0x0000,0x3fff,0xfff0,0x2080,0x0410,0x2a9f,0x355e,
  118.    0x2499,0xb41e,0x2a9f,0x355e,0x2080,0x041e,0x3fff,0xfffe,
  119.    0x2000,0x001e,0x2fff,0xffde,0x2800,0x005e,0x280a,0xaade,
  120.    0x2805,0x55de,0x280a,0xaade,0x2805,0x55de,0x280a,0xaade,
  121.    0x2805,0x55de,0x2aaa,0xaade,0x2955,0x55de,0x2aaa,0xaade,
  122.    0x2955,0x55de,0x2aaa,0xaade,0x2955,0x55de,0x2aaa,0xaade,
  123.    0x2955,0x55de,0x2bff,0xffde,0x2fff,0xffde,0x2000,0x001e,
  124.    0x3fff,0xfffe,0x07ff,0xfffe,0x07ff,0xfffe,0x0000,0x0000
  125. };
  126.  
  127. int textmask[] = {
  128.   0x7fff,0xfff8,0x7fff,0xfff8,0x7fff,0xffff,0x7fff,0xffff,
  129.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  130.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  131.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  132.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  133.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  134.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  135.   0x7fff,0xffff,0x7fff,0xffff,0x0fff,0xffff,0x0fff,0xffff
  136. };
  137.  
  138. int textdata[] = {
  139.    0x0000,0x0000,0x3fff,0xfff0,0x2080,0x0410,0x2abf,0x655e,
  140.    0x248c,0x341e,0x2a8c,0x655e,0x2080,0x041e,0x3fff,0xfffe,
  141.    0x2000,0x001e,0x2020,0x001e,0x203c,0x721e,0x2022,0x8a1e,
  142.    0x2022,0x8a1e,0x203c,0x71de,0x2000,0x001e,0x2fff,0xffde,
  143.    0x2990,0x4f5e,0x2993,0xcf5e,0x2810,0xcf5e,0x2993,0xcf5e,
  144.    0x2990,0x415e,0x2fff,0xffde,0x2000,0x001e,0x2fff,0xffde,
  145.    0x2830,0x27de,0x2993,0xe1de,0x2fff,0xffde,0x2000,0x001e,
  146.    0x3fff,0xfffe,0x07ff,0xfffe,0x07ff,0xfffe,0x0000,0x0000
  147. };
  148.  
  149. int timermask[] = {
  150.   0x7fff,0xfff8,0x7fff,0xfff8,0x7fff,0xffff,0x7fff,0xffff,
  151.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  152.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  153.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  154.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  155.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  156.   0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,0x7fff,0xffff,
  157.   0x7fff,0xffff,0x7fff,0xffff,0x0fff,0xffff,0x0fff,0xffff
  158. };
  159.  
  160. int timerdata[] = {
  161.    0x0000,0x0000,0x3fff,0xfff0,0x2080,0x0410,0x2abf,0x655e,
  162.    0x248c,0x641e,0x2a8c,0x655e,0x2080,0x041e,0x3fff,0xfffe,
  163.    0x2000,0x001e,0x207f,0xf81e,0x20c0,0x0c1e,0x2303,0x031e,
  164.    0x2603,0x019e,0x2403,0x009e,0x2c03,0x00de,0x2803,0x005e,
  165.    0x2803,0x005e,0x2803,0x005e,0x2803,0xf05e,0x2800,0x005e,
  166.    0x2800,0x005e,0x2c00,0x00de,0x2400,0x009e,0x2600,0x019e,
  167.    0x2300,0x031e,0x20c0,0x0c1e,0x207f,0xf81e,0x2000,0x001e,
  168.    0x3fff,0xfffe,0x07ff,0xfffe,0x07ff,0xfffe,0x0000,0x0000
  169. };
  170.  
  171. int blankicon[] = {
  172.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  173.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  174.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  175.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  176.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  177.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  178.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  179.   0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000
  180. };
  181.  
  182. ICONBLK dt_iconblk[] = {
  183.   {clipboardmask, clipboarddata, "CLIPBOARD", 0x1000, 0x0000, 0x0000, 0x0014, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  184.   {trashcanmask, trashcandata, "TRASHCAN", 0x1000, 0x0000, 0x0000, 0x0014, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  185.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  186.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  187.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  188.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  189.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  190.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  191.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  192.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  193.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  194.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  195.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  196.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  197.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  198.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  199.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  200.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  201.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  202.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  203.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  204.   {blankicon, blankicon, "XXXXXXXX", 0x1058, 0x0000, 0x0000, 0x000b, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  205.   {dialogmask, dialogdata, "DIALOG X", 0x1041, 0x0006, 0x000b, 0x0014, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  206.   {textmask, textdata, "TEXT X", 0x1041, 0x0004, 0x0009, 0x0014, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008},
  207.   {timermask, timerdata, "TIMED X", 0x1058, 0x000d, 0x0014, 0x0014, 0x0000, 0x0020, 0x0020, 0x0000, 0x001e, 0x0048, 0x0008}};
  208.  
  209. OBJECT dt_object[] = {
  210.   /* Tree #0*/
  211.   {  -1,   1,  23,0x0014,0x0000,0x0000, (long)(0x00001173L),   0,   0, 289, 525},
  212.   {   2,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[0]),   0,1032,   9,1540},
  213.   {   3,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[1]),   9,1032,   9,1540},
  214.   {   4,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[2]), 256, 256,   9,1540},
  215.   {   5,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[3]), 256, 257,   9,1540},
  216.   {   6,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[4]), 256, 258,   9,1540},
  217.   {   7,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[5]), 256, 259,   9,1540},
  218.   {   8,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[6]), 262, 256,   9,1540},
  219.   {   9,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[7]), 262, 257,   9,1540},
  220.   {  10,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[8]), 262, 258,   9,1540},
  221.   {  11,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[9]), 262, 259,   9,1540},
  222.   {  12,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[10]), 268, 256,   9,1540},
  223.   {  13,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[11]), 268, 257,   9,1540},
  224.   {  14,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[12]), 268, 258,   9,1540},
  225.   {  15,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[13]), 268, 259,   9,1540},
  226.   {  16,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[14]), 274, 256,   9,1540},
  227.   {  17,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[15]), 274, 257,   9,1540},
  228.   {  18,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[16]), 274, 258,   9,1540},
  229.   {  19,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[17]), 274, 259,   9,1540},
  230.   {  20,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[18]), 280, 256,   9,1540},
  231.   {  21,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[19]), 280, 257,   9,1540},
  232.   {  22,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[20]), 280, 258,   9,1540},
  233.   {  23,  -1,  -1,0x001f,0x0041,0x0000, (long)(&dt_iconblk[21]), 280, 259,   9,1540},
  234.   {   0,  -1,  -1,0x0015,0x0020,0x0000, (long)(&dt_tedinfo[0]),1816,1036, 520,1536}};
  235.  
  236. OBJECT ic_object[] = {
  237.   {  -1,   1,   3,0x0014,0x0000,0x0010, (long)(0x00021100L),   0,   0,  52,   9},
  238.   {   2,  -1,  -1,0x001f,0x0000,0x0000, (long)(&dt_iconblk[22]), 512, 768,   9,1796},
  239.   {   3,  -1,  -1,0x001f,0x0000,0x0000, (long)(&dt_iconblk[23]), 521, 768,   9,1796},
  240.   {   0,  -1,  -1,0x001f,0x0020,0x0000, (long)(&dt_iconblk[24]), 530, 768,   9,1796}};
  241.  
  242. static char string1[] = "  Open/Restore       ";
  243. static char string2[] = "  Iconify            ";
  244. static char string3[] = "  Minimize/Maximize  ";
  245. static char string4[] = "≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡";
  246. static char string5[] = "  Close window       ";
  247. static char string6[] = "  Remove icon        ";
  248. static char string7[] = "≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡";
  249. static char string8[] = "  Window settings    ";
  250.  
  251. OBJECT pp_object[] = {
  252.   /* Tree #2*/
  253.   {  -1,   1,   1,0x0014,0x0000,0x0000, (long)(0x00001173L),   0,   0,1045,1032},
  254.   {   0,   2,   9,0x0014,0x0000,0x0020, (long)(0x00ff1100L), 256, 256,  21,   8},
  255.   {   3,  -1,  -1,0x001c,0x0005,0x0000, (long)(string1),   0,   0,  21,   1},
  256.   {   4,  -1,  -1,0x001c,0x0005,0x0000, (long)(string2),   0,   1,  21,   1},
  257.   {   5,  -1,  -1,0x001c,0x0005,0x0000, (long)(string3),   0,   2,  21,   1},
  258.   {   6,  -1,  -1,0x001c,0x0000,0x0008, (long)(string4),   0,   3,  21,   1},
  259.   {   7,  -1,  -1,0x001c,0x0005,0x0000, (long)(string5),   0,   4,  21,   1},
  260.   {   8,  -1,  -1,0x001c,0x0005,0x0000, (long)(string6),   0,   5,  21,   1},
  261.   {   9,  -1,  -1,0x001c,0x0000,0x0008, (long)(string7),   0,   6,  21,   1},
  262.   {   1,  -1,  -1,0x001c,0x0025,0x0000, (long)(string8),   0,   7,  21,   1}};
  263.  
  264. #define DESK     0   /* BOX in Tree DESKTOP */
  265. #define DCLIP    1   /* ICON in Tree DESKTOP */
  266. #define DTRASH   2   /* ICON in Tree DESKTOP */
  267. #define IC1      3   /* ICON in Tree DESKTOP */
  268. #define IC2      4   /* ICON in Tree DESKTOP */
  269. #define IC3      5   /* ICON in Tree DESKTOP */
  270. #define IC4      6   /* ICON in Tree DESKTOP */
  271. #define IC5      7   /* ICON in Tree DESKTOP */
  272. #define IC6      8   /* ICON in Tree DESKTOP */
  273. #define IC7      9   /* ICON in Tree DESKTOP */
  274. #define IC8      10  /* ICON in Tree DESKTOP */
  275. #define IC9      11  /* ICON in Tree DESKTOP */
  276. #define IC10     12  /* ICON in Tree DESKTOP */
  277. #define IC11     13  /* ICON in Tree DESKTOP */
  278. #define IC12     14  /* ICON in Tree DESKTOP */
  279. #define IC13     15  /* ICON in Tree DESKTOP */
  280. #define IC14     16  /* ICON in Tree DESKTOP */
  281. #define IC15     17  /* ICON in Tree DESKTOP */
  282. #define IC16     18  /* ICON in Tree DESKTOP */
  283. #define IC17     19  /* ICON in Tree DESKTOP */
  284. #define IC18     20  /* ICON in Tree DESKTOP */
  285. #define IC19     21  /* ICON in Tree DESKTOP */
  286. #define IC20     22  /* ICON in Tree DESKTOP */
  287. #define DESK_ID  23  /* TEXT in Tree DESKTOP */
  288. #define WOPICON  2   /* STRING in Tree WINPOP */
  289. #define WMINICON 3   /* STRING in Tree WINPOP */
  290. #define WMINMAX  4   /* STRING in Tree WINPOP */
  291. #define WKILICON 6   /* STRING in Tree WINPOP */
  292. #define WRMVICON 7   /* STRING in Tree WINPOP */
  293. #define WSETWIN  9   /* STRING in Tree WINPOP */
  294.  
  295. ICONBLK    *DIALICON = { &dt_iconblk[22] };
  296. ICONBLK    *TEXTICON = { &dt_iconblk[23] };
  297. ICONBLK *TIMEICON = { &dt_iconblk[24] };
  298.  
  299. OBJECT *desktop = dt_object;
  300. OBJECT *iconpopup = pp_object;
  301. OBJECT *iconsetpopup = ic_object;
  302.  
  303. GLOBAL void WSetup_Desktop(void)
  304. {
  305.     register int i;
  306.  
  307.     if (DesktopInstalled) {
  308.         RFix_ObjectPos(desktop);
  309.         RFix_ObjectPos(iconpopup);
  310.         RFix_ObjectPos(iconsetpopup);
  311.  
  312.         desktop[DESK].ob_x        = desk.g_x;
  313.         desktop[DESK].ob_y        = desk.g_y;
  314.         desktop[DESK].ob_width    = desk.g_w;
  315.         desktop[DESK].ob_height    = desk.g_h;
  316.  
  317.         if (num_colors == 2) {
  318.             desktop[DESK].ob_spec.obspec.fillpattern = 4;
  319.             desktop[DESK].ob_spec.obspec.interiorcol = BLACK;
  320.         }
  321.  
  322.         desktop[DCLIP].ob_y        = (desk.g_h - desktop[DCLIP].ob_height);
  323.         desktop[DTRASH].ob_y    = (desk.g_h - desktop[DTRASH].ob_height);
  324.         desktop[DESK_ID].ob_x    = (desk.g_w - desktop[DESK_ID].ob_width);
  325.         desktop[DESK_ID].ob_y    = (desk.g_h - desktop[DESK_ID].ob_height);
  326.  
  327.         desktop[DCLIP].ob_type    = (CLIP_MOUSE << 8) + G_ICON;
  328.         desktop[DTRASH].ob_type    = (TRASH_MOUSE << 8) + G_ICON;
  329.  
  330.         for (i = IC1; i<(IC20 + 1); i++)
  331.             desktop[i].ob_flags = SELECTABLE | TOUCHEXIT | HIDETREE;
  332.  
  333.         form_dial(0, desktop->ob_x, desktop->ob_y, desktop->ob_width, desktop->ob_height,
  334.                     desktop->ob_x, desktop->ob_y, desktop->ob_width, desktop->ob_height);
  335.  
  336.         wind_set(0, WF_NEWDESK, desktop, 0, 0);
  337.     }
  338. }
  339.  
  340. GLOBAL WINDOW *WFindIconWindow(int object)
  341. {
  342.     WINDOW *win = WindowChain;
  343.  
  344.     while (win->next) {
  345.         if (win->objnumber == object)
  346.             return(win);
  347.         win = win->next;
  348.     }
  349.     return((WINDOW *) 0L);
  350. }
  351.  
  352.  
  353. GLOBAL void WDesk_Redraw(void)
  354. {
  355.     GRECT r, d;
  356.  
  357.     if (DesktopInstalled) {
  358.         d.g_x = desk.g_x;
  359.         d.g_y = desk.g_y;
  360.         d.g_w = desk.g_w;
  361.         d.g_h = desk.g_h;
  362.  
  363.         WGrafMouse(M_OFF);
  364.         wind_update(BEG_UPDATE);
  365.  
  366.         wind_get(0, WF_FIRSTXYWH, &r.g_x, &r.g_y, &r.g_w, &r.g_h);
  367.         while(r.g_w || r.g_h) {
  368.             if (rc_intersect(&d, &r))
  369.                 objc_draw(desktop, 0, 16, r.g_x, r.g_y, r.g_w, r.g_h);
  370.  
  371.             wind_get(0, WF_NEXTXYWH, &r.g_x, &r.g_y, &r.g_w, &r.g_h);
  372.         }
  373.  
  374.         wind_update(END_UPDATE);
  375.         WGrafMouse(M_ON);
  376.     }
  377. }
  378.  
  379. GLOBAL void WDesk_ForceRedrawPortion(int x, int y, int w, int h)
  380. {
  381.     GRECT r, d;
  382.  
  383.     if (DesktopInstalled) {
  384.         d.g_x = x;
  385.         d.g_y = y;
  386.         d.g_w = w;
  387.         d.g_h = h;
  388.  
  389.         WGrafMouse(M_OFF);
  390.         wind_update(BEG_UPDATE);
  391.  
  392.         wind_get(0, WF_FIRSTXYWH, &r.g_x, &r.g_y, &r.g_w, &r.g_h);
  393.         while(r.g_w || r.g_h) {
  394.             if (rc_intersect(&d, &r))
  395.                 objc_draw(desktop, 0, 99, d.g_x, d.g_y, d.g_w, d.g_h);
  396.  
  397.             wind_get(0, WF_NEXTXYWH, &r.g_x, &r.g_y, &r.g_w, &r.g_h);
  398.         }
  399.  
  400.         wind_update(END_UPDATE);
  401.         WGrafMouse(M_ON);
  402.     }
  403. }
  404.  
  405. GLOBAL void WSet_IconPosition(int object, int x, int y)
  406. {
  407.     OBJECT *icon = &desktop[object];
  408.  
  409.     if (DesktopInstalled) {
  410.         icon->ob_x = x;
  411.         icon->ob_y = y;
  412.     }
  413. }
  414.  
  415. GLOBAL void WDesk_RedrawPortion(int x, int y, int w, int h)
  416. {
  417.     int msg[8];
  418.  
  419.     msg[0] = WM_REDRAW;
  420.     msg[3] = 0;
  421.     msg[4] = x;
  422.     msg[5] = desk.g_y + y;
  423.     msg[6] = w;
  424.     msg[7] = h;
  425.  
  426.     appl_write(Ap_ID, 16, msg);
  427. }
  428.  
  429. LOCAL void Restore_IP(void)
  430. {
  431.     if (DesktopInstalled) {
  432.         iconpopup[WOPICON].ob_state = NORMAL;
  433.         iconpopup[WMINICON].ob_state = NORMAL;
  434.         iconpopup[WMINMAX].ob_state = NORMAL;
  435.         iconpopup[WKILICON].ob_state = NORMAL;
  436.         iconpopup[WRMVICON].ob_state = NORMAL;
  437.         iconpopup[WSETWIN].ob_state = NORMAL;
  438.     }
  439. }
  440.  
  441. LOCAL void Disable_DeskIP(void)
  442. {
  443.     if (DesktopInstalled) {
  444.         iconpopup[WMINICON].ob_state = DISABLED;
  445.         iconpopup[WMINMAX].ob_state = DISABLED;
  446.         iconpopup[WKILICON].ob_state = DISABLED;
  447.         iconpopup[WRMVICON].ob_state = DISABLED;
  448.         iconpopup[WSETWIN].ob_state = DISABLED;
  449.     }
  450. }
  451.  
  452. LOCAL void Disable_DesktopIP(void)
  453. {
  454.     if (DesktopInstalled) {
  455.         iconpopup[WOPICON].ob_state = DISABLED;
  456.         iconpopup[WMINICON].ob_state = DISABLED;
  457.         iconpopup[WMINMAX].ob_state = DISABLED;
  458.         iconpopup[WKILICON].ob_state = DISABLED;
  459.         iconpopup[WRMVICON].ob_state = DISABLED;
  460.         iconpopup[WSETWIN].ob_state = DISABLED;
  461.     }
  462. }
  463.  
  464. LOCAL void Disable_RegularIP(void)
  465. {
  466.     if (DesktopInstalled) {
  467.         iconpopup[WMINICON].ob_state = DISABLED;
  468.         iconpopup[WMINMAX].ob_state = DISABLED;
  469.         iconpopup[WKILICON].ob_state = DISABLED;
  470.         iconpopup[WSETWIN].ob_state = DISABLED;
  471.     }
  472. }
  473.  
  474. GLOBAL void WDo_Desk(int object, int initialclicks, int mouseforms)
  475. {
  476.     OBJECT *d = desktop;
  477.     EVENT event;
  478.     int message;
  479.  
  480.     if (DesktopInstalled) {
  481.         if (AES_VERSION >= 0x0400) {
  482.             event.ev_mbreturn = initialclicks;
  483.             message = MU_BUTTON;
  484.         }
  485.  
  486.         event.ev_mbclicks = 0x101;
  487.         event.ev_bmask = 3;
  488.         event.ev_mbstate = 0;
  489.  
  490.         event.ev_mflags = MU_BUTTON | MU_TIMER;
  491.         event.ev_mtlocount = 0x0000;
  492.         event.ev_mthicount = 0x0000;
  493.  
  494.         if (AES_VERSION < 0x0400)
  495.             message = EvntMulti(&event);
  496.  
  497.         if (message & MU_BUTTON) {
  498.             if (event.ev_mbreturn == 1) {
  499.                 if ((d[object].ob_flags & TOUCHEXIT) && !(d[object].ob_flags & HIDETREE)) {
  500.                     int x, y, mx, my, dummy, newstate, oldx, oldy, i;
  501.                     WINDOW *delwin;
  502.  
  503.                     objc_offset(d, object, &x, &y);
  504.  
  505.                     oldx = x;
  506.                     oldy = y;
  507.  
  508.                     if (!mouseforms) {
  509.                         newstate = desktop[object].ob_state;
  510.                         newstate |= SELECTED;
  511.                         WObjc_Change(desktop, object, 0, newstate, 1);
  512.  
  513.                         graf_mouse(FLAT_HAND, 0L);
  514.                     }
  515.  
  516.                     i = WDragBoxDesk(object, desktop[object].ob_width, desktop[object].ob_height, x, y,
  517.                                     desk.g_x, desk.g_y, desk.g_w, desk.g_h, BLACK, 7, 0x5555,
  518.                                     &x, &y, FALSE, mouseforms);
  519.  
  520.                     if (!mouseforms)
  521.                         graf_mouse(ARROW, 0L);
  522.  
  523.                     if ((i!=DTRASH) && (i!=DCLIP) && (i>0) && (i!=object) && !(desktop[i].ob_flags & HIDETREE))
  524.                         WFormCustAlert(3, " Drag-and-drop ",
  525.                                 "Sorry, the Drag-and-drop",
  526.                                 "feature is only currently",
  527.                                 "available for MultiTOS or",
  528.                                 "Geneva.  WinLIB PRO does",
  529.                                 "not offer this (yet)."," ","[Okay"," ");
  530.  
  531.                     switch(i) {
  532.                         case DTRASH:
  533.                             switch(object) {
  534.                                 case DCLIP:
  535.                                     WFormCustAlert(3, " Clipboard ",
  536.                                     "The Clipboard is used for the",
  537.                                     "pasting of objects and icons",
  538.                                     "together, or for future use.",
  539.                                     "The clipboard cannot currently",
  540.                                     "be emptied."," ","[Okay"," ");
  541.                                     break;
  542.  
  543.                                 case IC1:
  544.                                 case IC2:
  545.                                 case IC3:
  546.                                 case IC4:
  547.                                 case IC5:
  548.                                 case IC6:
  549.                                 case IC7:
  550.                                 case IC8:
  551.                                 case IC9:
  552.                                 case IC10:
  553.                                 case IC11:
  554.                                 case IC12:
  555.                                 case IC13:
  556.                                 case IC14:
  557.                                 case IC15:
  558.                                 case IC16:
  559.                                 case IC17:
  560.                                 case IC18:
  561.                                 case IC19:
  562.                                 case IC20:
  563.                                     if (!(desktop[object].ob_flags & HIDETREE) && (desktop[object].ob_flags & TOUCHEXIT)) {
  564.                                         if (WFormCustAlert(3, " Remove icon ",
  565.                                             "Do you really wish to remove",
  566.                                             "this icon?  All changes will",
  567.                                             "be deleted.",
  568.                                             " ",
  569.                                             " ","[Okay"," ","C[ancel") == 1) {
  570.                                             delwin = WFindIconWindow(object);
  571.                                             WKillWindow(delwin);
  572.                                             WRemove_Icon(object, TRUE);
  573.                                         }
  574.                                     }
  575.                                     break;
  576.  
  577.                                 case DTRASH:
  578.                                     WFormCustAlert(3, " Trashcan ",
  579.                                     "The trashcan cannot be opened.",
  580.                                     " ",
  581.                                     " ",
  582.                                     " ",
  583.                                     " "," ","[Okay"," ");
  584.                                     break;
  585.                             }
  586.                         break;
  587.  
  588.                         case DCLIP:
  589.                             switch(object) {
  590.                                 case DTRASH:
  591.                                     WFormCustAlert(3, " Trashcan ",
  592.                                     "Illegal copy operation.",
  593.                                     " ",
  594.                                     " ",
  595.                                     " ",
  596.                                     " "," ","[Okay"," ");
  597.                                     break;
  598.  
  599.                                 default:
  600.                                     WFormCustAlert(3, " Clipboard ",
  601.                                     "Cannot open the clipboard at",
  602.                                     "this time.  Development for",
  603.                                     "windows with selectable icons",
  604.                                     "will be worked on later.",
  605.                                     " "," ","[Okay"," ");
  606.                                     break;
  607.                             }
  608.                         break;
  609.                     }
  610.  
  611.                     graf_mouse(ARROW, 0L);
  612.                     graf_mkstate(&mx, &my, &dummy, &dummy);
  613.  
  614.                     WSet_IconPosition(object, x, y - desk.g_y);
  615.  
  616.                     if (!WFindAnyOpen())
  617.                         WDesk_ForceRedrawPortion(oldx, oldy, desktop[object].ob_width, desktop[object].ob_height);
  618.                     else
  619.                         WDesk_RedrawPortion(oldx, oldy - desk.g_y, desktop[object].ob_width, desktop[object].ob_height);
  620.  
  621.                     if (!mouseforms) {
  622.                         newstate &= ~SELECTED;
  623.                         WObjc_Change(desktop, object, 0, newstate, 1);
  624.                     } else
  625.                         WObjc_Change(desktop, object, 0, desktop[object].ob_state, 1);
  626.                 }
  627.  
  628.                 if (object == 0) {
  629.                     int ww, hh;
  630.  
  631.                     WGraf_Rubberbox(event.ev_mmox, event.ev_mmoy, BLACK, 0,
  632.                                    0x0000, &ww, &hh, TRUE);
  633.                 }
  634.             }
  635.  
  636.             if (event.ev_mbreturn == 2) {
  637.                 int newstate;
  638.                 WINDOW *newwin;
  639.  
  640.                 switch (object) {
  641.                     case DCLIP:    newstate = desktop[object].ob_state;
  642.                                 newstate |= SELECTED;
  643.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  644.  
  645.                                 WFormCustAlert(3, " Clipboard ",
  646.                                 "Cannot open the clipboard at",
  647.                                 "this time.  Development for",
  648.                                 "windows with selectable icons",
  649.                                 "will be worked on later.",
  650.                                 " "," ","[Okay"," ");
  651.  
  652.                                 newstate &= ~SELECTED;
  653.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  654.                                 break;
  655.  
  656.                     case DTRASH:newstate = desktop[object].ob_state;
  657.                                 newstate |= SELECTED;
  658.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  659.  
  660.                                 WFormCustAlert(3, " Trashcan ",
  661.                                 "The trashcan cannot be opened.",
  662.                                 "It is used for the deletion",
  663.                                 "of iconified windows, or",
  664.                                 "application relative info.",
  665.                                 " "," ","[Okay"," ");
  666.  
  667.                                 newstate &= ~SELECTED;
  668.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  669.                                 break;
  670.  
  671.                     default:    if (!(desktop[object].ob_flags & HIDETREE) && (desktop[object].ob_flags & TOUCHEXIT) && (newwin = WFindIconWindow(object))!=(WINDOW *) 0L)
  672.                                     if (WCallIconifyDispatcher(newwin, FALSE)) {
  673.                                         graf_growbox(desktop[object].ob_x, desktop[object].ob_y,
  674.                                                     desktop[object].ob_width, desktop[object].ob_height,
  675.                                                     newwin->size.g_x, newwin->size.g_y,
  676.                                                     newwin->size.g_w, newwin->size.g_h);
  677.                                         WOpenWindow(newwin);
  678.                                         WRemove_Icon(object, FALSE);
  679.  
  680.                                         WDesk_RedrawPortion(desktop[object].ob_x, desktop[object].ob_y, desktop[object].ob_width, desktop[object].ob_height);
  681.                                     }
  682.  
  683.                                 break;
  684.                 }
  685.             }
  686.  
  687.             if (event.ev_mbreturn > 2) {
  688.                 /* Do hidden stuff here... */
  689.             }
  690.         } else {
  691.             if (initialclicks == 1) {
  692.                 int newstate, p;
  693.                 WINDOW *newwin;
  694.  
  695.                 switch (object) {
  696.                     case 0:        break;
  697.  
  698.                     case DCLIP:    newstate = desktop[object].ob_state;
  699.                                 newstate |= SELECTED;
  700.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  701.  
  702.                                 Disable_DeskIP();
  703.  
  704.                                 PMovePopupCoord(iconpopup, event.ev_mmox, event.ev_mmoy);
  705.                                 p = PDoPopupAddr(iconpopup);
  706.  
  707.                                 switch(p) {
  708.                                     case WOPICON:
  709.                                         WFormCustAlert(3, " Clipboard ",
  710.                                         "Cannot open the clipboard at",
  711.                                         "this time.  Development for",
  712.                                         "windows with selectable icons",
  713.                                         "will be worked on later.",
  714.                                         " "," ","[Okay"," ");
  715.                                         break;
  716.                                 }
  717.  
  718.                                 newstate &= ~SELECTED;
  719.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  720.  
  721.                                 Restore_IP();
  722.                                 break;
  723.  
  724.                     case DTRASH:newstate = desktop[object].ob_state;
  725.                                 newstate |= SELECTED;
  726.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  727.  
  728.                                 Disable_DeskIP();
  729.  
  730.                                 PMovePopupCoord(iconpopup, event.ev_mmox, event.ev_mmoy);
  731.                                 p = PDoPopupAddr(iconpopup);
  732.  
  733.                                 switch(p) {
  734.                                     case WOPICON:
  735.                                         WFormCustAlert(3, " Trashcan ",
  736.                                         "The trashcan cannot be opened.",
  737.                                         "It is used for the deletion",
  738.                                         "of iconified windows, or",
  739.                                         "application relative info.",
  740.                                         " "," ","[Okay"," ");
  741.                                         break;
  742.                                 }
  743.  
  744.                                 newstate &= ~SELECTED;
  745.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  746.  
  747.                                 Restore_IP();
  748.                                 break;
  749.  
  750.                     default:    if (!(desktop[object].ob_flags & HIDETREE) && (desktop[object].ob_flags & TOUCHEXIT)) {
  751.                                     newstate = desktop[object].ob_state;
  752.                                     newstate |= SELECTED;
  753.                                     WObjc_Change(desktop, object, 0, newstate, 1);
  754.  
  755.                                     Disable_RegularIP();
  756.  
  757.                                     PMovePopupCoord(iconpopup, event.ev_mmox, event.ev_mmoy);
  758.                                     p = PDoPopupAddr(iconpopup);
  759.  
  760.                                     switch(p) {
  761.                                         case WOPICON:
  762.                                             newwin = WFindIconWindow(object);
  763.                                             if (WCallIconifyDispatcher(newwin, FALSE)) {
  764.                                                 graf_growbox(desktop[object].ob_x, desktop[object].ob_y,
  765.                                                         desktop[object].ob_width, desktop[object].ob_height,
  766.                                                         newwin->size.g_x, newwin->size.g_y,
  767.                                                         newwin->size.g_w, newwin->size.g_h);
  768.                                                 WOpenWindow(newwin);
  769.                                                 WRemove_Icon(object, FALSE);
  770.  
  771.                                                 WDesk_RedrawPortion(desktop[object].ob_x, desktop[object].ob_y, desktop[object].ob_width, desktop[object].ob_height);
  772.                                             }
  773.                                             break;
  774.  
  775.                                         case WRMVICON:
  776.                                             newwin = WFindIconWindow(object);
  777.                                             WKillWindow(newwin);
  778.                                             WRemove_Icon(object, TRUE);
  779.  
  780.                                             WDesk_RedrawPortion(desktop[object].ob_x, desktop[object].ob_y, desktop[object].ob_width, desktop[object].ob_height);
  781.                                             break;
  782.  
  783.                                         default:
  784.                                             break;
  785.                                     }
  786.  
  787.                                     newstate &= ~SELECTED;
  788.                                     WObjc_Change(desktop, object, 0, newstate, 1);
  789.  
  790.                                     Restore_IP();
  791.                                 }
  792.                                 break;
  793.                 }
  794.             }
  795.  
  796.             if (initialclicks == 2) {
  797.                 int newstate;
  798.                 WINDOW *newwin;
  799.  
  800.                 switch (object) {
  801.                     case DCLIP:    newstate = desktop[object].ob_state;
  802.                                 newstate |= SELECTED;
  803.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  804.  
  805.                                 WFormCustAlert(3, " Clipboard ",
  806.                                 "Cannot open the clipboard at",
  807.                                 "this time.  Development for",
  808.                                 "windows with selectable icons",
  809.                                 "will be worked on later.",
  810.                                 " "," ","[Okay"," ");
  811.  
  812.                                 newstate &= ~SELECTED;
  813.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  814.                                 break;
  815.  
  816.                     case DTRASH:newstate = desktop[object].ob_state;
  817.                                 newstate |= SELECTED;
  818.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  819.  
  820.                                 WFormCustAlert(3, " Trashcan ",
  821.                                 "The trashcan cannot be opened.",
  822.                                 "It is used for the deletion",
  823.                                 "of iconified windows, or",
  824.                                 "application relative info.",
  825.                                 " "," ","[Okay"," ");
  826.  
  827.                                 newstate &= ~SELECTED;
  828.                                 WObjc_Change(desktop, object, 0, newstate, 1);
  829.                                 break;
  830.  
  831.                     default:    if (!(desktop[object].ob_flags & HIDETREE) && (desktop[object].ob_flags & TOUCHEXIT) && (newwin = WFindIconWindow(object))!=(WINDOW *) 0L) {
  832.                                     int x, y;
  833.  
  834.                                     graf_growbox(desktop[object].ob_x, desktop[object].ob_y,
  835.                                                 desktop[object].ob_width, desktop[object].ob_height,
  836.                                                 newwin->size.g_x, newwin->size.g_y,
  837.                                                 newwin->size.g_w, newwin->size.g_h);
  838.  
  839.                                     WOpenWindow(newwin);
  840.                                     WRemove_Icon(object, FALSE);
  841.  
  842.                                     WDesk_RedrawPortion(desktop[object].ob_x, desktop[object].ob_y, desktop[object].ob_width, desktop[object].ob_height);
  843.                                 }
  844.                                 break;
  845.                 }
  846.             }
  847.         }
  848.     }
  849. }
  850.  
  851. GLOBAL void WIconify(WINDOW *win)
  852. {
  853.     int freeicon, found = FALSE;
  854.  
  855.     if (DesktopInstalled && !(win->state & W_DESKTOP)) {
  856.  
  857.         freeicon = (IC1 - 1);
  858.         do {
  859.             freeicon++;
  860.             if (desktop[freeicon].ob_flags & HIDETREE)
  861.                 found = TRUE;
  862.         } while((freeicon<IC20) && !(found));
  863.  
  864.         win->objnumber = freeicon;
  865.  
  866.         if (win->state & W_DIALOG) {
  867.             desktop[freeicon].ob_flags = SELECTABLE | TOUCHEXIT;
  868.             desktop[freeicon].ob_spec.iconblk = DIALICON;
  869.             desktop[freeicon].ob_x = win->size.g_x;
  870.             desktop[freeicon].ob_y = win->size.g_y;
  871.             desktop[freeicon].ob_type = (DIALOG_MOUSE << 8) + G_ICON;
  872.  
  873.             strncpy(desktop[freeicon].ob_spec.iconblk->ib_ptext, win->origtitle, 12);
  874.  
  875.             WCruelCloseWindow(win, TRUE);
  876.             WObjc_Change(desktop, freeicon, 0, NORMAL, 1);
  877.         }
  878.  
  879.         if (win->state & W_TIMER) {
  880.             desktop[freeicon].ob_flags = SELECTABLE | TOUCHEXIT;
  881.             desktop[freeicon].ob_spec.iconblk = TIMEICON;
  882.             desktop[freeicon].ob_x = win->size.g_x;
  883.             desktop[freeicon].ob_y = win->size.g_y;
  884.             desktop[freeicon].ob_type = (TIMER_MOUSE << 8) + G_ICON;
  885.  
  886.             strncpy(desktop[freeicon].ob_spec.iconblk->ib_ptext, win->origtitle, 12);
  887.  
  888.             WCruelCloseWindow(win, TRUE);
  889.             WObjc_Change(desktop, freeicon, 0, NORMAL, 1);
  890.         }
  891.  
  892.         if (win->state & W_TEXT) {
  893.             desktop[freeicon].ob_flags = SELECTABLE | TOUCHEXIT;
  894.             desktop[freeicon].ob_spec.iconblk = TEXTICON;
  895.             desktop[freeicon].ob_x = win->size.g_x;
  896.             desktop[freeicon].ob_y = win->size.g_y;
  897.             desktop[freeicon].ob_type = (TEXT_MOUSE << 8) + G_ICON;
  898.  
  899.             strncpy(desktop[freeicon].ob_spec.iconblk->ib_ptext, win->origtitle, 12);
  900.  
  901.             WCruelCloseWindow(win, TRUE);
  902.             WObjc_Change(desktop, freeicon, 0, NORMAL, 1);
  903.         }
  904.     }
  905. }
  906.  
  907. GLOBAL int WRemove_Icon(int ic, int drag)
  908. {
  909.     int icon, x, y;
  910.  
  911.     if (DesktopInstalled) {
  912.         icon = ic;
  913.  
  914.         if (drag)
  915.             graf_movebox(desktop[icon].ob_width, desktop[icon].ob_height,
  916.                         desktop[icon].ob_x, desktop[icon].ob_y,
  917.                         desktop[DTRASH].ob_x, desktop[DTRASH].ob_y);
  918.  
  919.         desktop[icon].ob_flags = SELECTABLE | TOUCHEXIT | HIDETREE;
  920.         desktop[icon].ob_type = G_ICON;
  921.  
  922.         form_dial(0, desktop->ob_x, desktop->ob_y, desktop->ob_width, desktop->ob_height,
  923.                     desktop->ob_x, desktop->ob_y, desktop->ob_width, desktop->ob_height);
  924.  
  925.         return(TRUE);
  926.     }
  927.  
  928.     return(FALSE);
  929. }